Homework 3 on Knowledge

Foreword

This assignment should be finished with Prolog.

Question I

Given a set, list all its elements.
给出一个集合,列出其所有元素

1
2
3
4
5
/* using MS Windows GUN prolog(gprolog)
query :mymember(X,[1,2,3,4,5]). */
mymember(X,[_|Y]):- mymember(X,Y).
mymember(X,[X|_]).

(Thanks to Shiyu Wu)

Question II

Given a set, list all its subsets.
给出一个集合,列出其所有子集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* gprolog
Supposing the subset is in order.
EXAMPLE:
| ?- subset([2,3],[1,2,3]).
true ?
yes
| ?- subset(X,[1,2,3]).
X = [1,2,3] ? ;
X = [1,2] ? ;
X = [1,3] ? ;
X = [1] ? ;
X = [2,3] ? ;
X = [2] ? ;
X = [3] ? ;
X = [] ? ;
*/
subset([],[]).
subset([A|B],[A|C]):- subset(B,C).
subset(A,[_|B]):- subset(A,B).

(Thanks to Pan Shi)

匿名变量 _
prolog中,变量由大写字母或下划线 _ 开头。
匿名变量 _ 不会绑定为任何值,所以也不要求它所出现的位置的值必须相同。

列表表达 |
Prolog提供了把表头项目以及除去表头项目后剩下的列表分离的方法。
其次,Prolog强大的递归功能可以方便地访问除去表头项目后的列表。
如:

1
[X | Y]

使用此列表可以与任意的列表匹配,匹配成功后,X绑定为列表的第一个项目的值,
我们称之为表头(head)。而Y则绑定为剩下的列表,我们称之为表尾(tail),举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
?- [H|T] = [apple, broccoli, refrigerator].
H = apple
T = [broccoli, refrigerator]
?- [H|T] = [a, b, c, d, e].
H = a
T = [b, c, d, e]
?- [H|T] = [apples, bananas].
H = apples
T = [bananas]
?- [H|T] = [a, [b,c,d]]. /* 这个例子中的第一层列表有两个项目。*/
H = a
T = [[b, c, d]]
?- [H|T] = [apples]. /*列表中只有一个项目的情况 */
H = apples
T = []
0%